package com.example;

import java.util.Random;
import java.util.Scanner;

/**
 * 案例十：模拟双色球
 */
public class Test10 {
    public static void main(String[] args) {
        /*
        需求
        双色球彩票,由前区6个红球号码和后区1个蓝球号码组成,前区6个红球号码是从1~33中选择;
        后区蓝球号码是从1~16中选择;而且前区6个红球号码是不能重复的,编写程序,能够让用户录入一注双色球彩票;也可以随机产生一注双色球彩票
         */

        int[] userSelectNumbers = userSelectNumbers();
        System.out.print("您投注的一注双色球彩票结果是:");
        printArray(userSelectNumbers);

        int[] luckNumbers = createLuckNumbers();
        System.out.print("产生的幸运号码是:");
        printArray(luckNumbers);

        judge(userSelectNumbers, luckNumbers);
    }

    /**
     * 判断用户输入的彩票号码和产生的幸运号码是否一致
     *
     * @param userNumbers 用户输入的彩票号码
     * @param luckNumbers 随机生成的幸运号码
     */
    public static void judge(int[] userNumbers, int[] luckNumbers) {
        // userNumbers = [12, 14, 16, 18, 23, 26, 8]
        // luckNumbers = [16, 17, 18, 19, 26, 32, 8]

        // 分别定义2个变量用于记住红球命中了几个以及蓝球命中了几个
        int redCount = 0;
        int blueCount = 0;
        // 遍历前6个位置,判断用户输入的号码和产生的幸运号码是否一致
        for (int i = 0; i < userNumbers.length - 1; i++) {
            // userNumbers[i]
            // 开始遍历中奖号码的前6个红球号码,看用户当前选择的这个号码是否中奖
            for (int j = 0; j < luckNumbers.length - 1; j++) {
                if (userNumbers[i] == luckNumbers[j]) {
                    redCount++;
                    break;
                }
            }
        }
        
        // 判断篮球的号码是否中奖
        blueCount = userNumbers[6] == luckNumbers[6] ? 1 : 0;
        System.out.println("您红球中" + redCount + "个,篮球中" + blueCount + "个");

        if (redCount == 6 && blueCount == 1) {
            System.out.println("恭喜您,中奖1000万,可以开始享受人生了~~~");
        } else if (redCount == 6 && blueCount == 0) {
            System.out.println("恭喜您,中奖500万,可以稍微开始享受人生了~~~");
        } else if (redCount == 5 && blueCount == 1) {
            System.out.println("恭喜您,中奖3000元,可以出去吃顿小龙虾了~");
        } else if (redCount == 5 && blueCount == 0 || redCount == 4 && blueCount == 1) {
            System.out.println("恭喜您,中了小奖：200元~");
        } else if (redCount == 4 && blueCount == 0 || redCount == 3 && blueCount == 1) {
            System.out.println("中了10元~");
        } else if (redCount < 3 && blueCount == 1) {
            System.out.println("中了5元~");
        } else {
            System.out.println("感谢您对福利事业做出的巨大贡献~~~");
        }
    }

    /**
     * 产生一组随机的中奖号码
     *
     * @return 返回这组幸运号码
     */
    public static int[] createLuckNumbers() {
        Random r = new Random();
        // 先创建一个数组长度为7 (前6个是红球号码,最后1个是蓝球号码)
        int[] luckNumbers = new int[7];
        // 先循环前6个位置,并生成1~33之间的随机数,存入数组中
        for (int i = 0; i < luckNumbers.length - 1; i++) {
            // 生成1~33之间的随机数
            int randomNum = r.nextInt(33) + 1;
            // 判断当前的随机数是否重复
            if (exist(luckNumbers, randomNum)) {
                // 说明当前的随机数重复了,所以需要重新随机 并且i-- 重新本次循环
                i--;
            } else {
                // 说明当前的随机数没有重复,直接赋值给数组
                luckNumbers[i] = randomNum;
            }
        }

        // 最后一个位置是蓝球号码,随机生成1~16之间的随机数,存入数组中
        int blueBallNum = r.nextInt(16) + 1;
        luckNumbers[6] = blueBallNum;
        return luckNumbers;
    }

    /**
     * 模拟用户输入彩票号码
     *
     * @return 返回用户输入的彩票号码数组
     */
    public static int[] userSelectNumbers() {
        // 使用动态初始化数组,存储用户输入的彩票号码,因为我们目前只确定数组的长度为7,(前6个是红球号码,最后1个是蓝球号码)
        int[] numbers = new int[7];
        Scanner sc = new Scanner(System.in);
        // 注意这里为什么要减一,先遍历前6个位置,输入红球的号码并存入数组中
        for (int i = 0; i < numbers.length - 1; i++) {
            // 注意前6为数表示红球,第7个表示蓝球
            System.out.print("请您输入第" + (i + 1) + "个(红球 1~33之间不能重复)彩票号码:");
            int redBallNum = sc.nextInt();
            if (redBallNum < 1 || redBallNum > 33) {
                System.out.println("红球的号码范围应该在1~33之间,请重新输入");
            }
            // 判断输入的红球号码是否重复
            if (exist(numbers, redBallNum)) {
                // 说明重复了
                System.out.println("您输入的红球号码重复,请重新输入");
                // 并且i--回退一步,重新本次循环
                i--;
            } else {
                // 说明没有重复
                numbers[i] = redBallNum;
            }
        }

        while (true) {
            // 上面的循环结束之后,说明用户输入了6个红球号码,那么现在需要让用户输入蓝球号码
            System.out.print("请您输入第7个(蓝球)彩票号码:");
            int blueBallNum = sc.nextInt();
            if (blueBallNum < 1 || blueBallNum > 16) {
                System.out.println("蓝球的号码范围应该在1~16之间,请重新输入");
            } else {
                // 说明没有重复,直接赋值给数组的最后一个元素
                numbers[6] = blueBallNum;
                // 跳出循环
                break;
            }
        }

        return numbers;
    }

    /**
     * 判断number是否在数组arr中存在
     *
     * @param arr    数组
     * @param number 要找的数
     * @return 存在返回true, 不存在返回false
     */
    public static boolean exist(int[] arr, int number) {
        // 需求：判断number这个数字是否在numbers数组中存在
        // numbers = [12, 25, 18, 0, 0, 0, 0]
        // number = 12
        for (int i = 0; i < arr.length; i++) {
            // 如果当前位置是0,说明存在的数字已经遍历完了,没有找到,可以不同继续向后面遍历了
            if (arr[i] == 0) {
                break;
            }
            if (arr[i] == number) {
                return true;
            }
        }
        return false;
    }

    /**
     * 打印数组
     *
     * @param arr 数组
     */
    public static void printArray(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            // 判断是否是最后一个元素,如果是,那么就直接输出,而不用在后面再输出","
            System.out.print(i == arr.length - 1 ? arr[i] : arr[i] + ", ");
        }
        System.out.println("]");
    }
}

